Символьные (аналитические) операции
Основные операции с
выражениями
Выражения (ехрr) или уравнения (eqn) обычно используются как сами по себе,
так и в виде равенств или неравенств. В последнем случае объекты с выражениями
имеют левую и правую части. Для простейших манипуляций с выражениями полезны
следующие функции:
Ввиду очевидности действия этих функций
ограничимся наглядными примерами их применения:
![]()
![]()
![]()
![]()
![]()
![]()
> Odenom(f)
Преобразование выражений в тождественные формы
Многие математические выражения имеют
различные тождественные формы. Порою преобразование выражения из одной формы в
другую позволяет получить результат, более удобный для последующих вычислений.
Кроме того, различные функции Maple работают с разными формами выражений и
разными типами данных. Поэтому большое значение имеет целенаправленное
преобразование выражений и данных.
Основной функцией для такого
преобразования является функция convert:
convert(expr.
form, аrgЗ. ...)
Здесь ехрr — любое выражение, form — наименование формы, аrg3, ... — необязательные дополнительные аргументы.
convert — простая и вместе с тем очень мощная
функция. Ее мощь заключается в возможности задания множества параметров. Многие
из этих параметров очевидны с первого взгляда, поскольку повторяют наименования
типов чисел, данных или функций. Например, опции binary, decimal, hex и octal преобразуют заданные числа в их
двоичное, десятичное, шестнадцатеричное и восьмеричное представление. Параметр vector задает преобразование списка в вектор
(напоминаем, что список и вектор — разные типы данных), а параметр matrix — в
матрицу. Приведем примеры применения функции convert:
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
Преобразование выражений
Еще одним мощным средством преобразования
выражений является функция combine.
Она обеспечивает объединение показателей степенных функций и преобразование
тригонометрических и некоторых иных функций. Эта функция -может записываться в
трех формах:
combine(f)
combine(f, n)
combine(f, n, opt1, opt2, ...)
Здесь f — любое выражение, множество или
список выражений; n — имя, список или множество имен; opt1, opt2, ... — имена параметров. Во втором
аргументе можно использовать следующие функции:
|
@@ |
abs |
Arctan |
conjugate |
exp |
|
In |
piecewise |
polylog |
power |
product |
|
Ps |
radical |
Range |
signum |
trig |
Примеры применения функции combine представлены ниже:
![]()
![]()
![]()
![]()
Эти примеры далеко не исчерпывают
возможностей функции combine в
преобразовании выражений. Рекомендуется обзорно просмотреть примеры применения
функции combine с разными параметрами, приведенные в
справочной системе Maple.
Подстановки
Функциональные преобразования подвыражений
Нередко бывает необходимо заменить
некоторое подвыражение в заданном выражении на функцию от этого подвыражения.
Для этого можно воспользоваться функцией applyop:
Ниже даны примеры применения этой
функции:
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
Функциональные преобразования элементов списков
Еще две функции, реализующие операции
подстановки, указаны ниже:
map(fcn, expr, arg2, .... argn)
map2(fcn, argl, expr, arg3, .... argn)
Здесь fcn — процедура или имя, expr — любое выражение, argi — необязательные дополнительные
аргументы для fcn.
Первая из этих функций позволяет
приложить fen к операндам выражения ехрr. Приведенные далее примеры иллюстрируют
использование функции mар.
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
Из этих примеров нетрудно заметить, что
если второй параметр функции mар —
список, то функция (первый параметр) прикладывается к каждому элементу списка,
так что возвращается также список. Из последнего примера видно, что если за
вторым параметром идет перечисление аргументов, то они включаются в список
параметров функции.
Функция mар2 отличается иным расположением параметров. Ее действие
наглядно поясняют следующие примеры:
![]()
![]()
![]()
![]()
Подстановки с помощью функций add, mul и seq
Заметим, что операции, подобные описанным
выше, Maple реализует и с рядом других функций. Ограничимся примерами на
подстановки с помощью функций сложения add, умножения mul и создания
последовательностей seq:
![]()
![]()
![]()
![]()
![]()
![]()
![]()
Подстановки с помощью функций subs и subsop
Подстановки в общем случае служат для
замены одной части выражения на другую. Частными видами подстановок являются
такие виды операций, как замена одной переменной на другую или замена
символьного значения переменной ее численным значением. Основные операции
подстановки выполняют следующие функции:
Все эти функции возвращают измененное
после подстановки выражение. Ниже показаны примеры применения функций
подстановок:
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
Следует обратить внимание на то, что
результат подстановок, полученный с помощью функции subop, порой может не совпадать с ожидаемым.
Поэтому полезно контролировать получаемые в результате подстановок выражения на
их корректность.
Одним из важных применений подстановок
является проверка правильности решений уравнений и систем уравнений. Ниже дан
пример такой проверки:
![]()
![]()
![]()
Здесь задана система из трех нелинейных
уравнений, которая затем решена функцией solve. В конце примера с помощью функции подстановки выполнена проверка
правильности решения. Оно верно, поскольку у всех уравнений значение левой
части совпадает со значением правой части.
Функции сортировки и селекции
Сортировка и селекция выражений широко
используются в практике символьных преобразований. Для выполнения сортировки
служит функция sort,
применяемая в одной из следующих форм:
sort(L) sort(L. F)
sort(A) sort(A. V)
Здесь L — список сортируемых значений, F
— необязательная булева процедура с двумя аргументами, А — алгебраическое
выражение, V — необязательные дополнительные переменные.
![]()
![]()
![]()
![]()
![]()
![]()
![]()
Если функция сортировки меняет порядок
расположения членов в выражении (или порядок расположения выражений), то другая
функция — select — служит для выделения требуемого
выражения:
select(f, e)
select(f, е. b1, ..., bn)
Как бы обратной ей по действию служит
функция remove, устраняющая заданные выражения:
remove(f, e)
remove(f, е, b1.... bn)
В этих функциях f — процедура,
возвращающая логическое значение, е — список, множество, сумма, произведение
или функция, b1, ..., bn — необязательные дополнительные аргументы.
Далее даны примеры применения этих
функций.
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
Maple имеет также оператор селекции А[ехрr]. Его действие поясняют следующие
примеры:
![]()
![]()
![]()
![]()
![]()
![]()
![]()
Упрощение выражений
Функция simplify — одна из самых мощных в системах символьной математики.
Тем не менее стремление представить многие математические выражения в наиболее
простом виде поощряется в большинстве вычислений и нередко составляет их цель.
В системе Maple функция упрощения используется в следующем виде:
Функция simplify — многоцелевая. Она обеспечивает упрощение математических
выражений, выполняя следующие типовые действия (для простоты обозначим их как
->):
Несмотря на свою гибкость, функция simplify не всегда способна выполнить возможные
упрощения. В этом случае ей надо подсказать, в какой области ищутся упрощения и
где можно найти соответствующие упрощающие преобразования.
С этой целью в функцию simplify можно включать дополнительные параметры.
В качестве параметров могут задаваться
имена специальных математических функций и указания на область действия
упрощений: Bessell,
BesselJ, BesselK, BesselY, Ei, GAMMA, RootOf, LambertW, dilog, exp, In, sqrt,
polylog, pg, pochhammer, trig (для
всех тригонометрических функций), hypergeom, radical, power и atsign (для операторов). Полезен также параметр symbolic, явно указывающий на проведение
символьных преобразований.
Возможно также применение функции simplify в форме simplify[<name>], где <name> — одно из следующих указаний: atsign, GAMMA, hypergeom, power, radical,
RootOf, , sqrt, trig. Ниже
даны примеры применения функции Simplifу:
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
Действие функции simplify существенно зависит от областей
определения переменных. В следующем примере упрощение выражения не произошло,
поскольку результат этой операции неоднозначен:
![]()
Однако, определив переменные как реальные
или положительные, можно легко добиться желаемого упрощения:
![]()
![]()
Читателю настоятельно рекомендуется
просмотреть все разделы справочной системы, относящиеся к примерам применения
функции simplify (в том числе с другими функциями
символьных преобразований), поскольку их число очень велико и эти примеры
наглядно демонстрируют необходимость правильного применения разнообразных
параметров для придания упрощениям нужного характера. Если функция simplify не способна выполнить упрощение
выражения ехрr, то она просто его повторяет. Это сигнал
к применению опций.
Расширение выражений
Порой упрощенное выражение скрывает его особенности, знание которых является желательным. Функция expand «расширяет» выражение ехрr и записывается в виде:
expanc(expr, expr1, ехрг2, .... ехрrn)
где ехрr — расширяемое выражение, exprl, ехрг2, ..., ехрrn — необязательные подвыражения — опции. Имеется также инертная форма данной функции — Expand (ехрr). Кроме того, возможно применение операторной конструкции frontend(expans,[expr]).
Функция expand раскладывает рациональные выражения на простые дроби, полиномы на полиномиальные разложения, она способна раскрыть многие математические функции, такие как sin, cos, tan, sinh, cosh, tanh, det, erf, exp, factorial, GAMMA, In, max, min, Psi, binomial, sum, product, int, limit, bernoulli, euler, abs, signum, pochhammer, polylog, BesselJ, BesselY, Bessell, BesselK, AngerJ, Beta, Hankel, Kelvin, Struve, WeberE и функция piecewise. С помощью дополнительных аргументов expr1, ехрr2, ..., exprh можно задать расширение отдельных фрагментов в ехрr.
Примеры применения функции expand приведены ниже:
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
Факторизация выражений
Для разложения целых или рациональных чисел на множители в виде простых чисел служит функция:
ifactor(n)
или
ifactor(n,method)
где n — число, method — параметр, задающий метод разложения. Другая библиотечная функция, ifactors(n), возвращает результат разложения в форме вложенных списков:
![]()
![]()
![]()
![]()
![]()
![]()
![]()
Разложение выражений (факторизация)
Для алгебраических выражений функция факторизации записывается в вычисляемой и не вычисляемой (инертной) формах:
factor(a)
Factor(a)
factpr(a.K)
Factor(а.К)
Здесь а — полином с несколькими переменными, К — необязательное алгебраическое расширение. Для получения результата от инертной формы функции факторизации надо использовать функции вычисления evala или evalgf.
Главная цель факторизации это нахождение максимального числа независимых сомножителей выражения, линейных по заданным переменным с коэффициентами наиболее простой формы. Ниже представлены примеры применения функции factor:
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
Комплектование по степеням
Еще одна функция общего назначения — collect — служит для комплектования выражения ехрr по степеням указанного фрагмента х (в том числе множества либо списка). Она задается в одной из следующих форм:
collect(a, x)
collect(a, x, form, func)
Во второй форме этой функции дополнительно задаются параметры form (форма) и func (функция или процедура). Параметр form может иметь два значения- recursive (рекурсивная форма) и distributed (дистрибутивная форма). Параметр func позволяет задать имя функции, по которой будет идти комплектование ехрr. Примеры применения функции collect представлены ниже:
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
Программирование символьных операций
Реализация итераций Ньютона в символьном виде
Найти достаточно простую и наглядную задачу, решение которой отсутствует в системе Maple, не очень просто. Поэтому для демонстрации решения задачи с применением аналитических методов воспользуемся примером, ставшим классическим, — реализуем итерационный метод Ньютона при решении нелинейного уравнения вида f(x) = 0.
Как известно, метод Ньютона сводится к итерационным вычислениям по следующей формуле:
xi+1=x1+f(x1)/f'(x1);
Реализующая его процедура выглядит довольно просто:
Для получения итерационной формулы в аналитическом виде здесь используется функция unapply. Теперь, если задать решаемое уравнение, то можно получить искомое аналитическое выражение:
Далее, задав начальное приближение для х в виде х = х0, можно получить результаты вычислений для ряда итераций:
Нетрудно заметить, что, испытав скачок в начале решения, значениях довольно быстро сходятся к конечному результату, дающему корень заданной функции. Последние три итерации дают одно и то же значение х. Заметим, что этот метод дает только одно решение, даже если корней несколько. Вычислить другие корни в таком случае можно, изменив начальное условие.
Можно попробовать с помощью полученной процедуры получить решение и для другой функции:
Здесь итерационная формула имеет (и вполне естественно) уже другой вид, но сходимость к корню также обеспечивается за несколько итераций. ;
Возможна и иная форма задания итерационной процедуры с применением оператора дифференцирования D и заданием исходной функции также в виде процедуры:
Вообще говоря, в программных процедурах можно использовать любые операторы и функции, присущие Maple-языку, в том числе и те, которые реализуют символьные вычисления. Это открывает широкий простор для разработки новых процедур и функций, обеспечивающих выполнение символьных операций.
Задания: